from rest_framework import serializers
from django_redis import get_redis_connection


class ImageCodeCheckSerializer(serializers.Serializer):
    """
    图片验证码序列化器
    参数：image_code_id  text
    """
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(max_length=4, min_length=4)

    # attrs是一个字典，包括所有要校验的参数
    def validate(self, attrs):
        image_code_id = attrs['image_code_id']
        text = attrs['text']

        # 取到正确的图片验证码内容
        redis_conn = get_redis_connection('verify_codes')
        real_image_code_text = redis_conn.get('img_%s' % image_code_id)
        if not real_image_code_text:
            raise serializers.ValidationError('图片验证码已失效')

        # 删除redis中的图片验证码,防止恶意刷短信
        redis_conn.delete('img_%s' % image_code_id)

        # 比较图片验证码内容
        # 将字节类型转换成字符串类型
        real_image_code_text = real_image_code_text.decode()
        if real_image_code_text.lower() != text.lower():
            raise serializers.ValidationError('图片验证码错误')

        # 根据手机号判断是否可以发送短信验证码
        # get_serializer方法在创建序列化器对象时，会补充context属性
        # context 属性中包含 request  format  view
        # self.context['view'] ---- 当前视图对象
        # django的类视图对象中, kwargs属性保存了路径提取出来的参数
        mobile = self.context['view'].kwargs['mobile']
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag:
            raise serializers.ValidationError('请求短信验证码过于频繁')

        return attrs
